﻿using FastBuild;
using System.Diagnostics;
using System.Security.Cryptography;
using System.Text;

namespace FileSynchronization
{
    /// <summary>
    /// 
    /// </summary>
    public static class CommonHelper
    {
        /// <summary>
        /// 递归复制文件夹
        /// </summary>
        /// <param name="sourceDirPath">源目录</param>
        /// <param name="destDirPath">目标目录</param>
        public static void CopyDirectory(string sourceDirPath, string destDirPath)
        {
            if (!Directory.Exists(sourceDirPath))
                throw new OutPutException("未找到源文件夹");

            if (!Directory.Exists(destDirPath))
                Directory.CreateDirectory(destDirPath);

            // 获取源文件夹中的所有文件和文件夹
            string[] files = Directory.GetFiles(sourceDirPath, "*", SearchOption.AllDirectories);

            foreach (var file in files)
            {
                // 构建目标文件路径
                string relativePath = Path.GetRelativePath(sourceDirPath, file);
                string destFilePath = Path.Combine(destDirPath, relativePath);

                var dirPath = Path.Combine(destDirPath, relativePath.Substring(0, relativePath.IndexOf(Path.GetFileName(relativePath))));
                if (!Directory.Exists(dirPath))
                    Directory.CreateDirectory(dirPath);

                // 替换文件
                System.IO.File.Copy(file, destFilePath, true);
            }
        }

        public static void RunCmd(string cmd, out string output)
        {
            cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明：不管命令是否成功均执行exit命令，否则当调用ReadToEnd()方法时，会处于假死状态
            using (Process p = new Process())
            {
                p.StartInfo.FileName = "C:\\Windows\\System32\\cmd.exe";
                p.StartInfo.UseShellExecute = false;        //是否使用操作系统shell启动
                p.StartInfo.RedirectStandardInput = true;   //接受来自调用程序的输入信息
                p.StartInfo.RedirectStandardOutput = true;  //由调用程序获取输出信息
                p.StartInfo.RedirectStandardError = true;   //重定向标准错误输出
                p.StartInfo.CreateNoWindow = true;          //不显示程序窗口
                p.Start();//启动程序

                //向cmd窗口写入命令
                p.StandardInput.WriteLine(cmd);
                p.StandardInput.AutoFlush = true;

                //获取cmd窗口的输出信息
                output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();//等待程序执行完退出进程
                p.Close();
            }
        }

        public static string GetMD5Hash(string input)
        {
            using (MD5 md5 = MD5.Create())
            {
                byte[] inputBytes = Encoding.UTF8.GetBytes(input);
                byte[] hashBytes = md5.ComputeHash(inputBytes);

                StringBuilder builder = new StringBuilder();

                for (int i = 0; i < hashBytes.Length; i++)
                {
                    builder.Append(hashBytes[i].ToString("x2")); // 将每个字节转换为 2 位的十六进制字符串
                }

                return builder.ToString();
            }
        }
    }
}
